//面向切片原理简单实现：
Function.prototype.before = function (cb) {
  var _self = this;

  return function () {
    //执行before里面的回调函数
    cb.apply(_self, arguments);
    //执行this函数
    var res = _self.apply(_self, arguments);

    //实现用户编写的函数的返回值
    return res;
  }

}

Function.prototype.after = function (cb) {
  //这里的this是before内部返回的函数本身
  var _self = this;

  return function () {
    //执行this函数
    var res = _self.apply(_self, arguments);
    //执行after里面的回调函数
    cb.apply(_self, arguments)

    //实现用户编写的函数的返回值
    return res;
  }
}


//用户编写区域：
function test() {
  console.log('逻辑业务代码');

  return '123';
}

test
  .before(() => console.log('切面1：test函数之前的程序'))
  .after(() => console.log('切面2：test函数之后的程序'))()

//打印结果：
// 切面1：test函数之前的程序
// 逻辑业务代码
// 切面2：test函数之后的程序